home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / util / flyPlugin / Cstm2Dlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-02  |  10.3 KB  |  401 lines

  1. // cstm2dlg.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "flyplugin.h"
  6. #include "chooser.h"
  7. #include "cstm2dlg.h"
  8. #include "flypluginaw.h"
  9.  
  10. #ifdef _PSEUDO_DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. char *buf_img2=0;
  16. extern BITMAPINFO bmi;
  17. extern char classes_names[MAX_CLASSES][64];
  18. extern int num_classes;
  19.  
  20. struct param_desc
  21. {
  22.     char name[64];
  23.     int type;
  24. } param[MAX_CLASSES][MAX_PARAM];
  25. int nparam[MAX_CLASSES];
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CCustom2Dlg dialog
  29.  
  30.  
  31. CCustom2Dlg::CCustom2Dlg()
  32.     : CAppWizStepDlg(CCustom2Dlg::IDD)
  33. {
  34.     //{{AFX_DATA_INIT(CCustom2Dlg)
  35.     //}}AFX_DATA_INIT
  36. }
  37.  
  38.  
  39. void CCustom2Dlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41.     CAppWizStepDlg::DoDataExchange(pDX);
  42.     //{{AFX_DATA_MAP(CCustom2Dlg)
  43.     DDX_Control(pDX, IDC_PARAMETERS, m_param);
  44.     DDX_Control(pDX, IDC_PARAM_NAME, m_paramname);
  45.     DDX_Control(pDX, IDC_PARAM_TYPE, m_paramtype);
  46.     DDX_Control(pDX, IDC_CLASSES, m_classes);
  47.     //}}AFX_DATA_MAP
  48. }
  49.  
  50. // This is called whenever the user presses Next, Back, or Finish with this step
  51. //  present.  Do all validation & data exchange from the dialog in this function.
  52. BOOL CCustom2Dlg::OnDismiss()
  53. {
  54.     if (!UpdateData(TRUE))
  55.         return FALSE;
  56.  
  57.     char buf[8192],buf2[4096],str[512],str2[512];
  58.     buf[0]=0; buf2[0]=0;
  59.     int i,j;
  60.     for( i=0;i<num_classes;i++ )
  61.     {
  62.     sprintf(str,"int %s::step(int dt)\n{\n\t// TODO: animate dt milliseconds\n\treturn 0;\n}\n\n",classes_names[i]);
  63.     strcat(buf,str);
  64.     sprintf(str,"void %s::draw()\n{\n\t// TODO: draw using opengl\n}\n\n",classes_names[i]);
  65.     strcat(buf,str);
  66.     sprintf(str,"bsp_object *%s::clone()\n{\n\t%s *tmp=new %s;\n\t*tmp=*this;\n\ttmp->source=this;\n\treturn tmp;\n}\n\n",classes_names[i],classes_names[i],classes_names[i]);
  67.     strcat(buf,str);
  68.     sprintf(str,"int %s::get_custom_param_desc(int i,param_desc *pd)\n{\n\tif (pd!=0)\n\tswitch(i)\n\t{\n",classes_names[i]);
  69.     strcat(buf,str);
  70.     for( j=0;j<nparam[i];j++ )
  71.         {
  72.         sprintf(str,"\tcase %i:\n\t\tpd->type='%c';\n\t\tpd->data=&%s;\n\t\tstrcpy(pd->name,\"%s\");\n\t\tbreak;\n",j,param[i][j].type,param[i][j].name,param[i][j].name);
  73.         strcat(buf,str);
  74.         }
  75.     sprintf(str,"\t}\n\treturn %i;\n}\n\n",nparam[i]);
  76.     strcat(buf,str);
  77.  
  78.     strcpy(str2,classes_names[i]);
  79.     strupr(str2);
  80.     sprintf(str,"class %s : public bsp_object\n{\npublic:\n\t%s() { type=TYPE_%s; };\n\n",classes_names[i],classes_names[i],str2);
  81.     strcat(buf2,str);
  82.     for( j=0;j<nparam[i];j++ )
  83.         {
  84.         sprintf(str,"\t%s %s;\n",GetParamClass(param[i][j].type),param[i][j].name);
  85.         strcat(buf2,str);
  86.         }
  87.     sprintf(str,"\n\tint step(int dt);\n\tvoid draw();\n\tint get_custom_param_desc(int i,param_desc *pd);\n\tbsp_object *clone();\n};\n");
  88.     strcat(buf2,str);
  89.     }
  90.     
  91.     Flypluginaw.m_Dictionary["CLASSES_CPP"]=buf;
  92.     Flypluginaw.m_Dictionary["CLASSES_H"]=buf2;
  93.  
  94.     return TRUE;
  95. }
  96.  
  97. BEGIN_MESSAGE_MAP(CCustom2Dlg, CAppWizStepDlg)
  98.     //{{AFX_MSG_MAP(CCustom2Dlg)
  99.     ON_WM_PAINT()
  100.     ON_BN_CLICKED(IDC_PARAM_DELETE, OnParamDelete)
  101.     ON_BN_CLICKED(IDC_PARAM_NEW, OnParamNew)
  102.     ON_BN_CLICKED(IDC_PARAM_DOWN, OnParamDown)
  103.     ON_BN_CLICKED(IDC_PARAM_UP, OnParamUp)
  104.     ON_CBN_SELCHANGE(IDC_CLASSES, OnSelchangeClasses)
  105.     ON_LBN_SELCHANGE(IDC_PARAMETERS, OnSelchangeParameters)
  106.     ON_EN_CHANGE(IDC_PARAM_NAME, OnChangeParamName)
  107.     ON_CBN_SELCHANGE(IDC_PARAM_TYPE, OnSelchangeParamType)
  108.     //}}AFX_MSG_MAP
  109. END_MESSAGE_MAP()
  110.  
  111.  
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CCustom2Dlg message handlers
  114.  
  115. void CCustom2Dlg::OnPaint() 
  116. {
  117.     CPaintDC dc(this); // device context for painting
  118.     
  119.     RECT rect;
  120.     GetClientRect(&rect);
  121.  
  122.     CBrush brush(RGB(96,96,96));
  123.     rect.right=180;
  124.     dc.FillRect(&rect,&brush);
  125.  
  126.     dc.SelectObject(GetStockObject(BLACK_PEN));
  127.  
  128.     dc.MoveTo(rect.right,0);
  129.     dc.LineTo(rect.right,rect.bottom);
  130.  
  131.     if (buf_img2==0)
  132.     {
  133.     HRSRC res=FindResource(hInst,"IMG2","TEMPLATE");
  134.     if (res)
  135.         {
  136.         HGLOBAL hg=LoadResource(hInst,res);
  137.         if (hg)
  138.             {
  139.             buf_img2=(char *)LockResource(hg);
  140.             if (buf_img2)
  141.                 {
  142.                 bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  143.                 bmi.bmiHeader.biWidth=128;
  144.                 bmi.bmiHeader.biHeight=128;
  145.                 bmi.bmiHeader.biPlanes=1;
  146.                 bmi.bmiHeader.biBitCount=24;
  147.                 bmi.bmiHeader.biCompression=BI_RGB;
  148.                 bmi.bmiHeader.biSizeImage=0;
  149.                 bmi.bmiHeader.biXPelsPerMeter=3600;
  150.                 bmi.bmiHeader.biYPelsPerMeter=3600; 
  151.                 bmi.bmiHeader.biClrUsed=0;     
  152.                 bmi.bmiHeader.biClrImportant=0; 
  153.                 }
  154.             }
  155.         }
  156.     }
  157.     if (buf_img2)
  158.         SetDIBitsToDevice(dc.m_hDC,
  159.             rect.right/2-64,32,128,128,
  160.             0,0,0,128,
  161.             &buf_img2[18],&bmi,DIB_RGB_COLORS);
  162. }
  163.  
  164. char *CCustom2Dlg::GetParamType(int type) 
  165. {
  166.     if (type>255 || type<-255)
  167.         return "plugin";
  168.     switch( type )
  169.     {
  170.     case 'a': return "angle";
  171.     case 'i': return "int";
  172.     case 'f': return "float";
  173.     case 'v': return "vector";
  174.     case 'c': return "color";
  175.     case '3': return "3ds file";
  176.     case 'm': return "fao file";
  177.     case 'b': return "bezier curve";
  178.     case 'h': return "bezier patch";
  179.     case 'w': return "wav file";
  180.     case 'p': return "picture file";
  181.     case 'o': return "stock object";
  182.     case 'd': return "active object";
  183.     }
  184.     return "nothing";
  185. }
  186.  
  187. char *CCustom2Dlg::GetParamClass(int type) 
  188. {
  189.     if (type>255 || type<-255)
  190.         return "bsp_object *";
  191.     switch( type )
  192.     {
  193.     case 'a': return "float";
  194.     case 'i': return "int";
  195.     case 'f': return "float";
  196.     case 'v': return "vector";
  197.     case 'c': return "vector";
  198.     case '3': return "mesh*";
  199.     case 'm': return "anim_mesh*";
  200.     case 'b': return "bezier_curve*";
  201.     case 'h': return "bezier_patch*";
  202.     case 'w': return "sound*";
  203.     case 'p': return "int";
  204.     case 'o': return "bsp_object*";
  205.     case 'd': return "bsp_object*";
  206.     }
  207.     return "nothing";
  208. }
  209.  
  210. void CCustom2Dlg::OnParamDelete() 
  211. {
  212.     int i=m_classes.GetCurSel();
  213.     int j=m_param.GetCurSel();
  214.     if (i==-1 || j==-1) return;
  215.     memcpy(¶m[i][j],¶m[i][j+1],sizeof(param[0][0])*(nparam[i]-j-1));
  216.     m_param.DeleteString(j);
  217.     nparam[i]--;
  218.     if (nparam[i])
  219.         if (j<nparam[i])
  220.             m_param.SetCurSel(j);
  221.         else m_param.SetCurSel(j-1);
  222.     OnSelchangeParameters();
  223. }
  224.  
  225. void CCustom2Dlg::OnParamNew() 
  226. {
  227.     int i=m_classes.GetCurSel();
  228.     if (i==-1) return;
  229.     int j=nparam[i];
  230.     char str[256];
  231.     nparam[i]++;
  232.     sprintf(str,"parameter%i",j);
  233.     strcpy(param[i][j].name,str);
  234.     param[i][j].type='i';
  235.     sprintf(str,"%s\t%s",param[i][j].name,GetParamType(param[i][j].type));
  236.     i=m_param.AddString(str);
  237.     m_param.SetCurSel(i);
  238.     OnSelchangeParameters();
  239. }
  240.  
  241. void CCustom2Dlg::OnParamDown() 
  242. {
  243.     int i=m_classes.GetCurSel();
  244.     int j=m_param.GetCurSel();
  245.     if (i==-1 || j==-1) return;
  246.     if (j<m_param.GetCount()-1)
  247.     {
  248.         char str[256];
  249.         m_param.GetText(j,str);
  250.         m_param.DeleteString(j);
  251.         m_param.InsertString(j+1,str);
  252.         struct param_desc pd;
  253.         pd=param[i][j];
  254.         param[i][j]=param[i][j+1];
  255.         param[i][j+1]=pd;
  256.         m_param.SetCurSel(j+1);
  257.         OnSelchangeParameters();
  258.     }
  259. }
  260.  
  261. void CCustom2Dlg::OnParamUp() 
  262. {
  263.     int i=m_classes.GetCurSel();
  264.     int j=m_param.GetCurSel();
  265.     if (i==-1 || j==-1) return;
  266.     if (j>0)
  267.     {
  268.         char str[256];
  269.         m_param.GetText(j,str);
  270.         m_param.DeleteString(j);
  271.         m_param.InsertString(j-1,str);
  272.         struct param_desc pd;
  273.         pd=param[i][j];
  274.         param[i][j]=param[i][j-1];
  275.         param[i][j-1]=pd;
  276.         m_param.SetCurSel(j-1);
  277.         OnSelchangeParameters();
  278.     }
  279. }
  280.  
  281. void CCustom2Dlg::OnSelchangeClasses() 
  282. {
  283.     m_param.ResetContent();
  284.     int i=m_classes.GetCurSel();
  285.     if (i==-1) return;
  286.     char str[16];
  287.     int j;
  288.     for( j=0;j<nparam[i];j++ )
  289.     {
  290.         sprintf(str,"%s\t%s",param[i][j].name,GetParamType(param[i][j].type));
  291.         m_param.AddString(str);
  292.     }
  293.     if (m_param.GetCount()>0)
  294.         m_param.SetCurSel(0);
  295.     OnSelchangeParameters();
  296. }
  297.  
  298. void CCustom2Dlg::OnSelchangeParameters() 
  299. {
  300.     int i=m_classes.GetCurSel();
  301.     int j=m_param.GetCurSel();
  302.     if (i==-1 || j==-1)
  303.     {
  304.         GetDlgItem(IDC_STATIC_NAME)->EnableWindow(0);
  305.         GetDlgItem(IDC_STATIC_TYPE)->EnableWindow(0);
  306.         GetDlgItem(IDC_PARAM_NAME)->EnableWindow(0);
  307.         GetDlgItem(IDC_PARAM_TYPE)->EnableWindow(0);
  308.         m_paramtype.SetCurSel(-1);
  309.         m_paramname.SetWindowText("");
  310.     }
  311.     else
  312.     {
  313.         GetDlgItem(IDC_STATIC_NAME)->EnableWindow(1);
  314.         GetDlgItem(IDC_STATIC_TYPE)->EnableWindow(1);
  315.         GetDlgItem(IDC_PARAM_NAME)->EnableWindow(1);
  316.         GetDlgItem(IDC_PARAM_TYPE)->EnableWindow(1);
  317.         m_paramtype.SelectString(-1,GetParamType(param[i][j].type));
  318.         m_paramname.SetWindowText(param[i][j].name);
  319.     }
  320. }
  321.  
  322. void CCustom2Dlg::OnChangeParamName() 
  323. {
  324.     int i=m_classes.GetCurSel();
  325.     int j=m_param.GetCurSel();
  326.     if (i==-1 || j==-1) return;
  327.     m_paramname.GetWindowText(param[i][j].name,64);
  328.     char str[256];
  329.     sprintf(str,"%s\t%s",param[i][j].name,GetParamType(param[i][j].type));
  330.     m_param.DeleteString(j);
  331.     m_param.InsertString(j,str);
  332.     m_param.SetCurSel(j);
  333. }
  334.  
  335. void CCustom2Dlg::OnSelchangeParamType() 
  336. {
  337.     int i=m_classes.GetCurSel();
  338.     int j=m_param.GetCurSel();
  339.     if (i==-1 || j==-1) return;
  340.     param[i][j].type=m_paramtype.GetItemData(m_paramtype.GetCurSel());
  341.     char str[256];
  342.     sprintf(str,"%s\t%s",param[i][j].name,GetParamType(param[i][j].type));
  343.     m_param.DeleteString(j);
  344.     m_param.InsertString(j,str);
  345.     m_param.SetCurSel(j);
  346. }
  347.  
  348. void CCustom2Dlg::InitDialog()
  349. {
  350.     m_classes.ResetContent();
  351.     m_paramtype.ResetContent();
  352.     m_param.SetTabStops(64);
  353.  
  354.     memset(nparam,0,sizeof(int)*MAX_CLASSES);
  355.     
  356.     int i;
  357.     for( i=0;i<num_classes;i++ )
  358.         m_classes.AddString(classes_names[i]);
  359.  
  360.     i=m_paramtype.AddString(GetParamType('i'));
  361.     m_paramtype.SetItemData(i,'i');
  362.     i=m_paramtype.AddString(GetParamType('f'));
  363.     m_paramtype.SetItemData(i,'f');
  364.     i=m_paramtype.AddString(GetParamType('c'));
  365.     m_paramtype.SetItemData(i,'c');
  366.     i=m_paramtype.AddString(GetParamType('v'));
  367.     m_paramtype.SetItemData(i,'v');
  368.     i=m_paramtype.AddString(GetParamType('3'));
  369.     m_paramtype.SetItemData(i,'3');
  370.     i=m_paramtype.AddString(GetParamType('m'));
  371.     m_paramtype.SetItemData(i,'m');
  372.     i=m_paramtype.AddString(GetParamType('b'));
  373.     m_paramtype.SetItemData(i,'b');
  374.     i=m_paramtype.AddString(GetParamType('w'));
  375.     m_paramtype.SetItemData(i,'w');
  376.     i=m_paramtype.AddString(GetParamType('p'));
  377.     m_paramtype.SetItemData(i,'p');
  378.     i=m_paramtype.AddString(GetParamType('o'));
  379.     m_paramtype.SetItemData(i,'o');
  380.     i=m_paramtype.AddString(GetParamType('d'));
  381.     m_paramtype.SetItemData(i,'d');
  382.  
  383.     m_param.ResetContent();
  384.  
  385.     if (m_classes.GetCount()>0)
  386.     {
  387.         m_classes.SetCurSel(0);
  388.         OnSelchangeClasses();
  389.     }
  390.     else OnSelchangeParameters();
  391. }
  392.  
  393. BOOL CCustom2Dlg::OnInitDialog() 
  394. {
  395.     CAppWizStepDlg::OnInitDialog();
  396.     
  397.     InitDialog();
  398.  
  399.     return TRUE;
  400. }
  401.